isPrime()等编译时测试的一种应用是，在编译时使用偏特化在不同实现之间进行选择。

例如，可以根据模板参数是否是素数来选择不同的实现:

\begin{lstlisting}[style=styleCXX]
// primary helper template:
template<int SZ, bool = isPrime(SZ)>
struct Helper;

// implementation if SZ is not a prime number:
template<int SZ>
struct Helper<SZ, false>
{
	...
};

// implementation if SZ is a prime number:
template<int SZ>
struct Helper<SZ, true>
{
	...
};

template<typename T, std::size_t SZ>
long foo (std::array<T,SZ> const& coll)
{
	Helper<SZ> h; // implementation depends on whether array has prime number as size
	...
}
\end{lstlisting}

根据std::array<>参数的大小是否为素数，使用了Helper<>类的两种不同实现。这种偏特化的应用广泛适用于函数根据模板参数，选择不同的实现。

上面，使用了两个偏特化来实现两个可能的替代方案，也可以对其中一个替代(默认)情况使用主模板，并对其他情况使用偏特化实现:

\begin{lstlisting}[style=styleCXX]
// primary helper template (used if no specialization fits):
template<int SZ, bool = isPrime(SZ)>
struct Helper
{
	...
};

// special implementation if SZ is a prime number:
template<int SZ>
struct Helper<SZ, true>
{
	...
};
\end{lstlisting}

因为函数模板不支持偏特化，所以必须使用其他机制根据某些约束来更改函数实现。可供的选择包括:

\begin{itemize}
\item 
带有静态函数的类，

\item 
std::enable\_if，在第6.3节中介绍。

\item 
SFINAE特性，

\item 
编译时if特性，该特性从C++17引入，将在第8.5节中介绍。
\end{itemize}

第20章讨论了基于约束选择函数实现的技术。






























































